home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / lib / ubiquity / plugins / ubi-language.py < prev    next >
Text File  |  2009-10-27  |  16KB  |  411 lines

  1. # -*- coding: utf-8; Mode: Python; indent-tabs-mode: nil; tab-width: 4 -*-
  2.  
  3. # Copyright (C) 2006, 2007, 2008 Canonical Ltd.
  4. # Written by Colin Watson <cjwatson@ubuntu.com>.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  19.  
  20. import os
  21. import re
  22. import locale
  23. import debconf
  24. import PyICU
  25.  
  26. from ubiquity.plugin import *
  27. from ubiquity import i18n, misc
  28.  
  29. NAME = 'language'
  30. AFTER = None
  31. WEIGHT = 10
  32.  
  33. _release_notes_url_path = '/cdrom/.disk/release_notes_url'
  34.  
  35. class PageBase(PluginUI):
  36.     def set_language_choices(self, choices, choice_map):
  37.         """Called with language choices and a map to localised names."""
  38.         self.language_choice_map = dict(choice_map)
  39.  
  40.     def set_language(self, language):
  41.         """Set the current selected language."""
  42.         pass
  43.  
  44.     def get_language(self):
  45.         """Get the current selected language."""
  46.         return 'C'
  47.  
  48.     def set_oem_id(self, text):
  49.         pass
  50.  
  51.     def get_oem_id(self):
  52.         return ''
  53.  
  54. class PageGtk(PageBase):
  55.     plugin_is_language = True
  56.  
  57.     def __init__(self, controller, *args, **kwargs):
  58.         self.controller = controller
  59.         if self.controller.oem_user_config:
  60.             ui_file = 'stepLanguageOnly.ui'
  61.             self.only = True
  62.         else:
  63.             ui_file = 'stepLanguage.ui'
  64.             self.only = False
  65.         try:
  66.             import gtk
  67.             builder = gtk.Builder()
  68.             builder.add_from_file('/usr/share/ubiquity/gtk/%s' % ui_file)
  69.             builder.connect_signals(self)
  70.             self.page = builder.get_object('stepLanguage')
  71.             self.iconview = builder.get_object('language_iconview')
  72.             self.treeview = builder.get_object('language_treeview')
  73.             self.oem_id_entry = builder.get_object('oem_id_entry')
  74.  
  75.             if self.controller.oem_config:
  76.                 builder.get_object('oem_id_vbox').show()
  77.  
  78.             release_notes_vbox = builder.get_object('release_notes_vbox')
  79.             if release_notes_vbox:
  80.                 try:
  81.                     release_notes_url = builder.get_object('release_notes_url')
  82.                     release_notes = open(_release_notes_url_path)
  83.                     release_notes_url.set_uri(
  84.                         release_notes.read().rstrip('\n'))
  85.                     release_notes.close()
  86.                 except (KeyboardInterrupt, SystemExit):
  87.                     raise
  88.                 except:
  89.                     release_notes_vbox.hide()
  90.         except Exception, e:
  91.             self.debug('Could not create language page: %s', e)
  92.             self.page = None
  93.         self.plugin_widgets = self.page
  94.  
  95.     def set_language_choices(self, choices, choice_map):
  96.         import gtk, gobject
  97.         PageBase.set_language_choices(self, choices, choice_map)
  98.         list_store = gtk.ListStore(gobject.TYPE_STRING)
  99.         for choice in choices:
  100.             list_store.append([choice])
  101.         # Support both iconview and treeview
  102.         if self.only:
  103.             self.iconview.set_model(list_store)
  104.             self.iconview.set_text_column(0)
  105.         else:
  106.             if len(self.treeview.get_columns()) < 1:
  107.                 column = gtk.TreeViewColumn(None, gtk.CellRendererText(), text=0)
  108.                 column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
  109.                 self.treeview.append_column(column)
  110.                 selection = self.treeview.get_selection()
  111.                 selection.connect('changed',
  112.                                     self.on_language_selection_changed)
  113.             self.treeview.set_model(list_store)
  114.  
  115.     def set_language(self, language):
  116.         # Support both iconview and treeview
  117.         if self.only:
  118.             model = self.iconview.get_model()
  119.             iterator = model.iter_children(None)
  120.             while iterator is not None:
  121.                 if unicode(model.get_value(iterator, 0)) == language:
  122.                     path = model.get_path(iterator)
  123.                     self.iconview.select_path(path)
  124.                     self.iconview.scroll_to_path(path, True, 0.5, 0.5)
  125.                     break
  126.                 iterator = model.iter_next(iterator)
  127.         else:
  128.             model = self.treeview.get_model()
  129.             iterator = model.iter_children(None)
  130.             while iterator is not None:
  131.                 if unicode(model.get_value(iterator, 0)) == language:
  132.                     path = model.get_path(iterator)
  133.                     self.treeview.get_selection().select_path(path)
  134.                     self.treeview.scroll_to_cell(
  135.                         path, use_align=True, row_align=0.5)
  136.                     break
  137.                 iterator = model.iter_next(iterator)
  138.  
  139.     def get_language(self):
  140.         # Support both iconview and treeview
  141.         if self.only:
  142.             model = self.iconview.get_model()
  143.             items = self.iconview.get_selected_items()
  144.             if not items:
  145.                 return 'C'
  146.             iterator = model.get_iter(items[0])
  147.         else:
  148.             selection = self.treeview.get_selection()
  149.             (model, iterator) = selection.get_selected()
  150.         if iterator is None:
  151.             return 'C'
  152.         else:
  153.             value = unicode(model.get_value(iterator, 0))
  154.             return self.language_choice_map[value][1]
  155.  
  156.     def on_language_activated(self, *args, **kwargs):
  157.         self.controller.go_forward()
  158.  
  159.     def on_language_selection_changed(self, *args, **kwargs):
  160.         lang = self.get_language()
  161.         if lang:
  162.             # strip encoding; we use UTF-8 internally no matter what
  163.             lang = lang.split('.')[0].lower()
  164.             self.controller.translate(lang)
  165.  
  166.     def set_oem_id(self, text):
  167.         return self.oem_id_entry.set_text(text)
  168.  
  169.     def get_oem_id(self):
  170.         return self.oem_id_entry.get_text()
  171.  
  172. class PageKde(PageBase):
  173.     plugin_breadcrumb = 'ubiquity/text/breadcrumb_language'
  174.     plugin_is_language = True
  175.  
  176.     def __init__(self, controller, *args, **kwargs):
  177.         self.controller = controller
  178.         try:
  179.             from PyQt4 import uic
  180.             from PyQt4.QtCore import SIGNAL
  181.             from PyQt4.QtGui import QLabel
  182.             self.page = uic.loadUi('/usr/share/ubiquity/qt/stepLanguage.ui')
  183.             self.combobox = self.page.language_combobox
  184.             self.combobox.currentIndexChanged[str].connect(self.on_language_selection_changed)
  185.  
  186.             if not self.controller.oem_config:
  187.                 self.page.oem_id_label.hide()
  188.                 self.page.oem_id_entry.hide()
  189.  
  190.             class linkLabel(QLabel):
  191.                 def __init__(self, wizard, parent):
  192.                     QLabel.__init__(self, parent)
  193.                     self.wizard = wizard
  194.  
  195.                 def mouseReleaseEvent(self, event):
  196.                     self.wizard.openReleaseNotes()
  197.  
  198.                 def setText(self, text):
  199.                     QLabel.setText(self, text)
  200.                     self.resize(self.sizeHint())
  201.  
  202.             self.release_notes_url = linkLabel(self, self.page.release_notes_frame)
  203.             self.release_notes_url.setObjectName("release_notes_url")
  204.             self.release_notes_url.show()
  205.  
  206.             self.release_notes_url_template = None
  207.             try:
  208.                 release_notes = open(_release_notes_url_path)
  209.                 self.release_notes_url_template = release_notes.read().rstrip('\n')
  210.                 release_notes.close()
  211.             except (KeyboardInterrupt, SystemExit):
  212.                 raise
  213.             except:
  214.                 self.page.release_notes_label.hide()
  215.                 self.page.release_notes_frame.hide()
  216.         except Exception, e:
  217.             self.debug('Could not create language page: %s', e)
  218.             self.page = None
  219.         self.plugin_widgets = self.page
  220.  
  221.     def openReleaseNotes(self):
  222.         lang = self.selected_language()
  223.         if lang:
  224.             lang = lang.split('.')[0].lower()
  225.             url = self.release_notes_url_template.replace('${LANG}', lang)
  226.             self.openURL(url)
  227.  
  228.     def openURL(self, url):
  229.         #need to run this else kdesu can't run Konqueror
  230.         misc.execute('su', '-c', 'xhost +localhost', 'ubuntu')
  231.         misc.execute('su', '-c', 'kfmclient openURL '+url, 'ubuntu')
  232.  
  233.     def set_language_choices(self, choices, choice_map):
  234.         from PyQt4.QtCore import QString
  235.         PageBase.set_language_choices(self, choices, choice_map)
  236.         self.combobox.clear()
  237.         for choice in choices:
  238.             self.combobox.addItem(QString(unicode(choice)))
  239.  
  240.     def set_language(self, language):
  241.         from PyQt4.QtCore import QString
  242.         index = self.combobox.findText(QString(unicode(language)))
  243.         if index < 0:
  244.             self.combobox.addItem("C")
  245.         else:
  246.             self.combobox.setCurrentIndex(index)
  247.  
  248.     def get_language(self):
  249.         lang = self.selected_language()
  250.         return lang if lang else 'C'
  251.  
  252.     def selected_language(self):
  253.         lang = self.combobox.currentText()
  254.         if lang.isNull():
  255.             return None
  256.         else:
  257.             return self.language_choice_map[unicode(lang)][1]
  258.  
  259.     def on_language_selection_changed(self):
  260.         lang = self.selected_language()
  261.         if lang:
  262.             # strip encoding; we use UTF-8 internally no matter what
  263.             lang = lang.split('.')[0].lower()
  264.  
  265.             self.controller.translate(lang)
  266.  
  267.             if self.release_notes_url_template is not None:
  268.                 url = self.release_notes_url_template.replace('${LANG}', lang)
  269.                 text = i18n.get_string('release_notes_url', lang)
  270.                 self.release_notes_url.setText('<a href="%s">%s</a>' % (url, text))
  271.  
  272.     def set_oem_id(self, text):
  273.         return self.page.oem_id_entry.setText(text)
  274.  
  275.     def get_oem_id(self):
  276.         return unicode(self.page.oem_id_entry.text())
  277.  
  278. class PageDebconf(PageBase):
  279.     plugin_title = 'ubiquity/text/language_heading_label'
  280.  
  281. class PageNoninteractive(PageBase):
  282.     def __init__(self, controller, *args, **kwargs):
  283.         self.controller = controller
  284.  
  285.     def set_language(self, language):
  286.         """Set the current selected language."""
  287.         # Use the language code, not the translated name
  288.         self.language = self.language_choice_map[language][1]
  289.  
  290.     def get_language(self):
  291.         """Get the current selected language."""
  292.         return self.language
  293.  
  294. class Page(Plugin):
  295.     def prepare(self, unfiltered=False):
  296.         self.language_question = None
  297.         self.initial_language = None
  298.         self.db.fset('localechooser/languagelist', 'seen', 'false')
  299.         try:
  300.             os.unlink('/var/lib/localechooser/preseeded')
  301.             os.unlink('/var/lib/localechooser/langlevel')
  302.         except OSError:
  303.             pass
  304.         if self.ui.controller.oem_config:
  305.             try:
  306.                 self.ui.set_oem_id(self.db.get('oem-config/id'))
  307.             except debconf.DebconfError:
  308.                 pass
  309.         questions = ['localechooser/languagelist']
  310.         environ = {'PATH': '/usr/lib/ubiquity/localechooser:' + os.environ['PATH']}
  311.         if 'UBIQUITY_FRONTEND' in os.environ and os.environ['UBIQUITY_FRONTEND'] == "debconf_ui":
  312.           environ['TERM_FRAMEBUFFER'] = '1'
  313.         else:
  314.           environ['OVERRIDE_SHOW_ALL_LANGUAGES'] = '1'
  315.         return (['/usr/lib/ubiquity/localechooser/localechooser'], questions,
  316.                 environ)
  317.  
  318.     def run(self, priority, question):
  319.         if question == 'localechooser/languagelist':
  320.             self.language_question = question
  321.             if self.initial_language is None:
  322.                 self.initial_language = self.db.get(question)
  323.             current_language_index = self.value_index(question)
  324.             current_language = "English"
  325.  
  326.             import gzip
  327.             languagelist = gzip.open('/usr/lib/ubiquity/localechooser/languagelist.data.gz')
  328.             language_display_map = {}
  329.             i = 0
  330.             for line in languagelist:
  331.                 line = unicode(line, 'utf-8')
  332.                 if line == '' or line == '\n':
  333.                     continue
  334.                 code, name, trans = line.strip(u'\n').split(u':')[1:]
  335.                 if code in ('dz', 'km'):
  336.                     i += 1
  337.                     continue
  338.                 language_display_map[trans] = (name, code)
  339.                 if i == current_language_index:
  340.                     current_language = trans
  341.                 i += 1
  342.             languagelist.close()
  343.  
  344.             try:
  345.                 # Note that we always collate with the 'C' locale.  This is far
  346.                 # from ideal.  But proper collation always requires a specific
  347.                 # language for its collation rules (languages frequently have
  348.                 # custom sorting).  This at least gives us common sorting rules,
  349.                 # like stripping accents.
  350.                 collator = PyICU.Collator.createInstance(PyICU.Locale('C'))
  351.             except:
  352.                 collator = None
  353.  
  354.             def compare_choice(x):
  355.                 if language_display_map[x][1] == 'C':
  356.                     return None # place C first
  357.                 if collator:
  358.                     try:
  359.                         return collator.getCollationKey(x).getByteArray()
  360.                     except:
  361.                         pass
  362.                 # Else sort by unicode code point, which isn't ideal either,
  363.                 # but also has the virtue of sorting like-glyphs together
  364.                 return x
  365.  
  366.             sorted_choices = sorted(language_display_map, key=compare_choice)
  367.             self.ui.set_language_choices(sorted_choices,
  368.                                          language_display_map)
  369.             self.ui.set_language(current_language)
  370.         return Plugin.run(self, priority, question)
  371.  
  372.     def cancel_handler(self):
  373.         self.ui.controller.translate(just_me=False) # undo effects of UI translation
  374.         Plugin.cancel_handler(self)
  375.  
  376.     def ok_handler(self):
  377.         if self.language_question is not None:
  378.             new_language = self.ui.get_language()
  379.             self.preseed(self.language_question, new_language)
  380.             if (self.initial_language is None or
  381.                 self.initial_language != new_language):
  382.                 self.db.reset('debian-installer/country')
  383.         if self.ui.controller.oem_config:
  384.             self.preseed('oem-config/id', self.ui.get_oem_id())
  385.         Plugin.ok_handler(self)
  386.  
  387.     def cleanup(self):
  388.         Plugin.cleanup(self)
  389.         # Done after sub-cleanup because now the debconf lock is clear for a reset/reget
  390.         i18n.reset_locale()
  391.         self.ui.controller.translate(just_me=False, reget=True)
  392.  
  393. class Install(InstallPlugin):
  394.     def prepare(self, unfiltered=False):
  395.         if 'UBIQUITY_OEM_USER_CONFIG' in os.environ:
  396.             return (['/usr/lib/ubiquity/localechooser-apply'], [])
  397.         else:
  398.             return (['sh', '-c',
  399.                      '/usr/lib/ubiquity/localechooser/post-base-installer ' +
  400.                      '&& /usr/lib/ubiquity/localechooser/finish-install'], [])
  401.  
  402.     def install(self, target, progress, *args, **kwargs):
  403.         progress.info('ubiquity/install/locales')
  404.         rv = InstallPlugin.install(self, target, progress, *args, **kwargs)
  405.         if not rv:
  406.             # fontconfig configuration needs to be adjusted based on the
  407.             # selected locale (from language-selector-common.postinst). Ignore
  408.             # errors.
  409.             misc.execute('chroot', target, 'fontconfig-voodoo', '--auto', '--force', '--quiet')
  410.         return rv
  411.